--[[
HUD系统模块
功能：提供日志显示和进度显示功能
--]]

-- HUD日志系统
local HUD = {
    id = nil,             -- HUD的ID
    isActive = false,     -- HUD是否显示
    logBuffer = {},       -- 日志缓冲区
    maxLogs = 5,          -- 显示的最大日志数量
    defaultFontSize = 10, -- 默认字体大小
    fontColor = "0xffff0000", -- 默认字体颜色
    bgColor = "0x60ffffff",   -- 背景颜色（更透明）
    xPos = 0,             -- X位置
    yPos = 80,            -- Y位置
    width = 500,          -- HUD宽度（缩小）
    height = 22,          -- 单行高度（缩小）
    -- 格式化日志模板
    日志格式 = "{时间} {内容}"  -- 默认格式，移除级别显示
}

-- 初始化HUD系统
local function 初始化HUD系统(配置)
    -- 确保HUD表存在
    if HUD == nil then
        print("警告: HUD表未定义，将重新创建")
        HUD = {
            id = nil,             -- HUD的ID
            isActive = false,     -- HUD是否显示
            logBuffer = {},       -- 日志缓冲区
            maxLogs = 5,          -- 显示的最大日志数量
            defaultFontSize = 10, -- 默认字体大小
            fontColor = "0xffff0000", -- 默认字体颜色
            bgColor = "0x60ffffff",   -- 背景颜色（更透明）
            xPos = 0,             -- X位置
            yPos = 80,            -- Y位置
            width = 500,          -- HUD宽度（缩小）
            height = 22,          -- 单行高度（缩小）
            -- 格式化日志模板
            日志格式 = "{时间} {内容}"  -- 默认格式，移除级别显示
        }
    end
    
    -- 尝试从UI配置加载HUD设置
    local 加载UI配置 = false
    pcall(function()
        if _G.获取HUD配置 and type(_G.获取HUD配置) == "function" then
            local ui配置 = _G.获取HUD配置()
            if ui配置 and type(ui配置) == "table" then
                配置 = 配置 or {}
                
                -- 如果UI配置中禁用了HUD，则直接返回
                if ui配置.启用HUD == false then
                    print("UI配置已禁用HUD显示")
                    HUD.isActive = false
                    return
                end
                
                -- 合并UI配置到当前配置
                配置.最大日志数 = 配置.最大日志数 or ui配置.最大日志数
                配置.字体大小 = 配置.字体大小 or ui配置.字体大小
                配置.字体颜色 = 配置.字体颜色 or ui配置.字体颜色
                配置.背景颜色 = 配置.背景颜色 or ui配置.背景颜色
                配置.X位置 = 配置.X位置 or ui配置.X位置
                配置.Y位置 = 配置.Y位置 or ui配置.Y位置
                配置.宽度 = 配置.宽度 or ui配置.宽度
                配置.高度 = 配置.高度 or ui配置.高度
                
                -- 应用日志格式
                if ui配置.日志格式 and ui配置.日志格式 ~= "" then
                    HUD.日志格式 = ui配置.日志格式
                end
                
                加载UI配置 = true
                print("已从UI加载HUD配置")
            end
        end
    end)
    
    if not 加载UI配置 then
        print("使用默认或传入的HUD配置")
    end
    
    配置 = 配置 or {}
    
    -- 使用pcall保护可能出错的代码
    local success, result = pcall(function()
        -- 应用配置
        HUD.maxLogs = 配置.最大日志数 or HUD.maxLogs
        HUD.defaultFontSize = 配置.字体大小 or HUD.defaultFontSize
        HUD.fontColor = 配置.字体颜色 or HUD.fontColor
        HUD.bgColor = 配置.背景颜色 or HUD.bgColor
        HUD.xPos = 配置.X位置 or HUD.xPos
        HUD.yPos = 配置.Y位置 or HUD.yPos
        HUD.width = 配置.宽度 or HUD.width
        HUD.height = 配置.高度 or HUD.height
        
        -- 如果已有HUD，先销毁
        if HUD.id then
            hideHUD(HUD.id)
            print("已销毁现有HUD，ID:" .. HUD.id)
        end
        
        -- 创建新HUD
        HUD.id = createHUD()
        HUD.isActive = true
        HUD.logBuffer = {}
        
        -- 返回ID
        return HUD.id
    end)
    
    if not success then
        print("初始化HUD系统出错: " .. tostring(result))
        -- 尝试创建一个简单的HUD作为备用
        pcall(function()
            if not HUD.id then
                HUD.id = createHUD()
                HUD.isActive = true
                showHUD(HUD.id, "HUD系统初始化失败，使用备用显示", 10, "0xffff0000", "0x60ffffff", 0, 80, 0, 500, 22)
            end
        end)
        return HUD.id
    else
        print("HUD系统已初始化，ID:" .. tostring(result))
        return result
    end
end

-- 设置日志格式
local function 设置日志格式(格式)
    if type(格式) == "string" then
        HUD.日志格式 = 格式
        print("日志格式已更新")
    end
end

-- 添加日志并更新HUD显示
local function 添加日志(内容, 级别)
    级别 = 级别 or "信息"
    local 时间标记 = os.date("%H:%M:%S")
    
    -- 使用模板格式化日志
    local 格式化日志 = HUD.日志格式
    格式化日志 = 格式化日志:gsub("{时间}", 时间标记)
    格式化日志 = 格式化日志:gsub("{级别}", 级别)
    格式化日志 = 格式化日志:gsub("{内容}", 内容)
    
    -- 添加到缓冲区
    table.insert(HUD.logBuffer, 1, 格式化日志) -- 新日志插入到开头
    
    -- 保持缓冲区大小
    while #HUD.logBuffer > HUD.maxLogs do
        table.remove(HUD.logBuffer) -- 移除最老的日志
    end
    
    -- 更新控制台输出（直接使用print，避免递归调用）
    print(格式化日志)
    
    -- 更新HUD显示
    更新HUD显示()
    
    return 格式化日志
end

-- 调试日志（原调试输出的替代函数）
local function 调试日志(内容)
    return 添加日志(内容, "调试")
end

-- 错误日志
local function 错误日志(内容)
    -- 直接添加日志而不通过调试输出，避免递归
    return 添加日志(内容, "错误")
end

-- 警告日志
local function 警告日志(内容)
    -- 直接添加日志而不通过调试输出，避免递归
    return 添加日志(内容, "警告")
end

-- 状态信息（固定显示在HUD最上方，不会滚动）
HUD.状态信息 = nil

-- 设置状态信息（固定显示在HUD顶部）
local function 设置状态信息(信息)
    HUD.状态信息 = 信息
    更新HUD显示()
end

-- 清除状态信息
local function 清除状态信息()
    HUD.状态信息 = nil
    更新HUD显示()
end

-- 显示进度条
local function 显示进度(当前值, 总值, 说明文本)
    当前值 = tonumber(当前值) or 0
    总值 = tonumber(总值) or 100
    说明文本 = 说明文本 or ""
    
    -- 确保范围在0-100%
    local 百分比 = math.min(100, math.max(0, (当前值 / 总值) * 100))
    
    -- 创建进度条字符串
    local 进度条长度 = 15  -- 缩短进度条长度
    local 已完成数量 = math.floor((百分比 / 100) * 进度条长度)
    local 进度条 = string.rep("█", 已完成数量) .. string.rep("░", 进度条长度 - 已完成数量)
    
    -- 格式化信息，更紧凑
    local 进度信息 = string.format("%s %s %.0f%%", 说明文本, 进度条, 百分比)
    
    -- 设置为状态信息
    设置状态信息(进度信息)
    
    return 进度信息
end

-- 更新HUD显示
local function 更新HUD显示()
    -- 先检查HUD是否可用
    if not HUD是否可用() then return end
    
    -- 使用pcall保护可能出错的代码
    local success, err = pcall(function()
        -- 准备显示内容
        local 显示文本列表 = {}
        
        -- 如果有状态信息，放在最上方
        if HUD.状态信息 then
            table.insert(显示文本列表, HUD.状态信息)
            -- 添加分隔行
            table.insert(显示文本列表, string.rep("-", 40))
        end
        
        -- 添加常规日志内容
        for _, 日志 in ipairs(HUD.logBuffer or {}) do
            table.insert(显示文本列表, 日志)
        end
        
        -- 合并所有文本
        local 显示文本 = table.concat(显示文本列表, "\n")
        
        -- 计算显示行数
        local 显示行数 = #显示文本列表
        
        -- 计算总高度（每行高度 * 行数）
        local 总高度 = HUD.height * 显示行数
        
        -- 显示HUD内容
        showHUD(
            HUD.id, 
            显示文本, 
            HUD.defaultFontSize, 
            HUD.fontColor, 
            HUD.bgColor, 
            HUD.xPos, 
            HUD.yPos, 
            0, 
            HUD.width, 
            总高度
        )
    end)
    
    if not success then
        print("更新HUD显示时出错: " .. tostring(err))
    end
end

-- 显示或隐藏HUD
local function 切换HUD显示(显示)
    if 显示 == nil then
        HUD.isActive = not HUD.isActive
    else
        HUD.isActive = 显示
    end
    
    if HUD.isActive then
        更新HUD显示()
    else
        hideHUD(HUD.id)
    end
    
    return HUD.isActive
end

-- 清空日志
local function 清空日志()
    HUD.logBuffer = {}
    更新HUD显示()
end

-- 销毁HUD
local function 销毁HUD()
    -- 使用pcall保护避免错误
    pcall(function()
        if HUD and HUD.id then
            hideHUD(HUD.id)
            HUD.id = nil
            HUD.isActive = false
            HUD.logBuffer = {}
            print("HUD系统已销毁")
        end
    end)
end

-- 安全检查HUD是否可用
local function HUD是否可用()
    return HUD ~= nil and HUD.id ~= nil and HUD.isActive == true
end

-- HUD预览函数
local function 预览HUD配置(配置)
    配置 = 配置 or {}
    
    -- 保存当前HUD状态
    local 旧ID = HUD.id
    local 旧状态 = HUD.isActive
    local 旧日志 = HUD.logBuffer
    
    -- 临时关闭现有HUD
    if HUD.id then
        hideHUD(HUD.id)
    end
    
    -- 初始化临时HUD
    local id = 初始化HUD系统(配置)
    
    -- 显示预览信息
    调试日志("HUD预览效果", 0)
    调试日志("这是一条日志消息", 0)
    调试日志("宽度: " .. HUD.width .. ", 高度: " .. HUD.height, 0)
    调试日志("位置: X=" .. HUD.xPos .. ", Y=" .. HUD.yPos, 0)
    调试日志("字体大小: " .. HUD.defaultFontSize, 0)
    
    -- 显示进度条示例
    显示进度(60, 100, "进度演示")
    
    -- 等待用户查看
    sleep(5000)
    
    -- 恢复原始HUD
    hideHUD(HUD.id)
    HUD.id = 旧ID
    HUD.isActive = 旧状态
    HUD.logBuffer = 旧日志
    
    if 旧ID and 旧状态 then
        更新HUD显示()
    end
    
    return true
end

-- 应用HUD配置函数
local function 应用HUD配置(配置)
    配置 = 配置 or {}
    
    -- 初始化新的HUD
    初始化HUD系统(配置)
    
    -- 提示已应用配置
    调试日志("已应用HUD配置", 0)
    
    return true
end

-- 重置HUD配置
local function 重置HUD配置()
    -- 恢复默认配置
    HUD = {
        id = nil,             -- HUD的ID
        isActive = false,     -- HUD是否显示
        logBuffer = {},       -- 日志缓冲区
        maxLogs = 6,          -- 显示的最大日志数量
        defaultFontSize = 10, -- 默认字体大小
        fontColor = "0xffff0000", -- 默认字体颜色
        bgColor = "0x60ffffff",   -- 背景颜色（更透明）
        xPos = 0,             -- X位置
        yPos = 80,            -- Y位置
        width = 500,          -- HUD宽度（缩小）
        height = 22,          -- 单行高度（缩小）
        -- 格式化日志模板
        日志格式 = "{时间} {内容}"  -- 默认格式，移除级别显示
    }
    
    -- 重新初始化HUD
    初始化HUD系统()
    
    -- 提示已重置配置
    调试日志("已重置HUD配置为默认值", 0)
    
    return true
end

-- 导出API
return {
    初始化HUD系统 = 初始化HUD系统,
    设置日志格式 = 设置日志格式,
    添加日志 = 添加日志,
    调试日志 = 调试日志,
    错误日志 = 错误日志,
    警告日志 = 警告日志,
    设置状态信息 = 设置状态信息,
    清除状态信息 = 清除状态信息,
    显示进度 = 显示进度,
    更新HUD显示 = 更新HUD显示,
    切换HUD显示 = 切换HUD显示,
    清空日志 = 清空日志,
    销毁HUD = 销毁HUD,
    HUD是否可用 = HUD是否可用,
    预览HUD配置 = 预览HUD配置,
    应用HUD配置 = 应用HUD配置,
    重置HUD配置 = 重置HUD配置
} 